#ifndef FHE_MATH_H
#define FHE_MATH_H

#include <fhe/core/Util.h>

namespace fhe
{
  namespace core
  {
    template <size_t D, typename T>
    class Rot;
    
    template <size_t D, typename T>
    class Vec;
    
    template <size_t D, typename T>
    class Mat;
    
    class Math
    {
    public:
      FHE_API static const double PI = 3.14159265359;
      FHE_API static const double EPS = 1e-5;
      
      FHE_API static bool equal( double d1, double d2, double eps = EPS );
      FHE_API static double abs( double d );
      FHE_API static double sqrt( double d );
      FHE_API static double max( double d1, double d2 );
      FHE_API static double cos( double t );
      FHE_API static double sin( double t );
      FHE_API static double atan2( double y, double x );
      FHE_API static double asin( double t );
      FHE_API static double acos( double t );
      FHE_API static double radians( double degrees );
      FHE_API static double degrees( double radians );

    private:
      Math();
      ~Math();
      Math( const Math& math );
      void operator=( const Math& math );
    };
  }
}

#include <fhe/math/Rot.h>
#include <fhe/math/Vec.h>
#include <fhe/math/Mat.h>

#endif
